为什么需要每日自动复盘
光有 MEMORY.md 不够。它是「精选长期记忆」,但每天的零散操作、决策、报错、灵感,如果不落地,第二天就忘。人工写日记又容易断。
最省事的方案:用 cron 每天定时触发一个 agent 回合,跑一段脚本把当天的工作区状态、git 提交、关键日志汇总成一篇日记,存进 memory/YYYY-MM-DD.md。
下面给一套能直接跑的实战。
第一步:写一个汇总脚本
放在 scripts/daily_review.py,职责很单纯——收集「今天发生了什么」:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import datetime, pathlib, subprocess
TZ = datetime.timezone(datetime.timedelta(hours=8))
today = datetime.datetime.now(TZ).strftime('%Y-%m-%d')
ws = pathlib.Path('/root/.openclaw/workspace')
# 1) 当天 git 提交
try:
log = subprocess.run(
['git', '-C', str(ws), 'log', f'--since={today} 00:00:00',
'--pretty=format:- %s (%h)'],
capture_output=True, text=True).stdout.strip()
except Exception:
log = '(git 读取失败)'
# 2) 工作区未提交改动
try:
st = subprocess.run(['git', '-C', str(ws), 'status', '--short'],
capture_output=True, text=True).stdout.strip()
except Exception:
st = ''
lines = [f'# {today} 每日复盘', '']
lines.append('## Git 提交')
lines.append(log if log else '- (无)')
lines.append('')
lines.append('## 未提交改动')
lines.append('```\n' + (st if st else '(干净)') + '\n```')
out = ws / 'memory' / f'{today}.md'
out.write_text('\n'.join(lines), encoding='utf-8')
print(f'wrote {out}')
脚本只做「采集」,不替你写结论——结论留给 AI 在 cron 回合里补。
第二步:挂一个每天运行的 cron
用 cron 定义让它在每天 23:00 跑:
名称:每日自动复盘
计划:cron 0 23 * * * @ Asia/Shanghai
目标:isolated
消息:运行 python3 /root/.openclaw/workspace/scripts/daily_review.py ,
然后读取刚生成的 memory/YYYY-MM-DD.md,
结合今天 sessions 的关键产出,补写「今日决策 / 踩坑 / 待办」三段,
并更新 MEMORY.md 里值得长期保留的条目。
只做记录,不发推送。
要点:
isolated目标 跑这种后台整理最合适,不占用你当前会话。
- 静默(
not requested) 避免每天被打扰,复盘是写给未来的自己看的。
第三步:加一道静默失败兜底(关键)
cron 最容易出的问题是静默失败——脚本报错、鉴权临时不可用,你完全感知不到,复盘悄无声息地断了。
参考 ensure_daily_post.py 的思路,做一个补跑闸:
# 每天 23:30 检查:今天的日记存在吗?不存在就补跑一次
import datetime, pathlib, subprocess
TZ = datetime.timezone(datetime.timedelta(hours=8))
today = datetime.datetime.now(TZ).strftime('%Y-%m-%d')
diary = pathlib.Path(f'/root/.openclaw/workspace/memory/{today}.md')
if not diary.exists():
subprocess.run(['python3',
'/root/.openclaw/workspace/scripts/daily_review.py'])
print('补跑:日记缺失,已重新生成')
else:
print('OK:今日日记已存在')
把它也挂成 cron(30 23 * * *),和主任务错开半小时,互为备份。
实战踩坑提醒
- 时区要对:cron 表达式的时区显式写
@ Asia/Shanghai,否则机器 UTC 会把「每天 23 点」算成北京时间早上 7 点。
- 别让复盘变成噪音:脚本只采集事实(git/log),AI 只补「决策/踩坑/待办」三段,控制在 30 行内。太长没人看。
- 兜底闸每天最多补一次:用状态文件记「今天是否已补跑」,避免反复触发。
小结
每日自动复盘 = 一个采集脚本 + 一个主 cron + 一个补跑闸。成本几乎为零(静默运行,不消耗你的注意力),回报是:任何时候翻 memory/,都能看到自己每天到底干了什么、为什么这么决策。
今天这篇,本身就是「被恢复的定时任务」场景下的产物——断更 23 天后重新跑通发布链路,正好印证了「兜底闸」的价值。
扫码关注公众号,获取更多 OpenClaw 实操技巧:
